home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_87 / vtspecia.pas < prev    next >
Pascal/Delphi Source File  |  1995-01-01  |  3KB  |  138 lines

  1. UNIT VTSpecial;
  2.  
  3. INTERFACE
  4.  
  5. CONST
  6.   MagicAX    = $5654;  {'VT'}
  7.   MagicBX    = $5472;  {'Tr'}
  8.   MagicCX    = $6163;  {'ac'}
  9.   MagicXorBx = $6B65;  {'ke'}
  10.   MagicXorCX = $7220;  {'r '}
  11.  
  12.  
  13.  
  14.  
  15. PROCEDURE VTResidentCheck(MyAppID: STRING);
  16.  
  17.  
  18.  
  19.  
  20. IMPLEMENTATION
  21.  
  22. TYPE
  23.   PString = ^STRING;
  24.  
  25.  
  26.  
  27. { ------ }
  28.  
  29. PROCEDURE CSOldInt2F; ASSEMBLER;
  30.   ASM
  31.         JMP FAR PTR CSOldInt2F;
  32.   END;
  33.  
  34. TYPE
  35.   PCSOldInt = ^TCSOldInt;
  36.   TCSOldInt = RECORD
  37.     JMP : BYTE;
  38.     Int : POINTER;
  39.   END;
  40.  
  41. VAR
  42.   _CSOldInt2F : PCSOldInt;
  43.   Int2fVector : POINTER ABSOLUTE 0:$2F*4;
  44.  
  45. { ------ }
  46.  
  47. VAR
  48.   AppID : STRING;
  49.  
  50. PROCEDURE MyInt2F; ASSEMBLER;
  51.   ASM
  52.  
  53.                 STI
  54.                 CMP     AX,MagicAX
  55.                 JNZ     @@Fin
  56.                 CMP     BX,MagicBX
  57.                 JNZ     @@Fin
  58.                 CMP     CX,MagicCX
  59.                 JNZ     @@Fin
  60.                 XOR     AX,AX
  61.                 XOR     BX,MagicXorBX
  62.                 XOR     CX,MagicXorCX
  63.                 MOV     DI,SEG(AppID)
  64.                 MOV     ES,DI
  65.                 MOV     DI,OFFSET AppID
  66.                 IRET
  67. @@Fin:
  68.                 JMP     CSOldInt2F
  69.  
  70.   END;
  71.  
  72. { ------ }
  73.  
  74. VAR
  75.   OldExitProc : POINTER;
  76.  
  77. PROCEDURE MyExitProc; FAR;
  78.   BEGIN
  79.     ExitProc := OldExitProc;
  80.     Int2FVector := _CSOldInt2F^.Int;
  81.   END;
  82.  
  83. { ------ }
  84.  
  85.  
  86. PROCEDURE VTResidentCheck(MyAppID: STRING);
  87.   CONST
  88.     NoAppID : STRING[10] = '¿?¿?¿? :-(';
  89.   VAR
  90.     AlreadyInShell : BOOLEAN;
  91.     AppIDFound     : PString;
  92.   BEGIN
  93.  
  94.     ASM
  95.                 MOV     AX,MagicAX
  96.                 MOV     BX,MagicBX
  97.                 MOV     CX,MagicCX
  98.                 XOR     DI,DI
  99.                 MOV     ES,DI
  100.                 INT     $2F
  101.                 XOR     DL,DL
  102.                 AND     AX,AX
  103.                 JNZ     @@no
  104.                 CMP     BX,MagicBX XOR MagicXorBX
  105.                 JNZ     @@no
  106.                 CMP     CX,MagicCX XOR MagicXorCX
  107.                 JNZ     @@no
  108.                 INC     DL
  109. @@no:           MOV     [AlreadyInShell],DL
  110.                 MOV     WORD PTR [AppIDFound+2],ES
  111.                 MOV     WORD PTR [AppIDFound],DI
  112.     END;
  113.  
  114.     IF AppIDFound = NIL THEN
  115.       AppIDFound := @NoAppID;
  116.  
  117.     IF AlreadyInShell THEN
  118.       BEGIN
  119.         WriteLn(#13#10'    ¡¡Ojo, que está el '+AppIDFound^+' residente!!');
  120.         HALT(1);
  121.       END;
  122.  
  123.     AppID := MyAppID;
  124.  
  125.     _CSOldInt2F := @CSOldInt2F;
  126.  
  127.     _CSOldInt2F^.Int := Int2FVector;
  128.     Int2FVector      := @MyInt2F;
  129.  
  130.     OldExitProc := ExitProc;
  131.     ExitProc    := @MyExitProc;
  132.   END;
  133.  
  134.  
  135.  
  136.  
  137. END.
  138.